import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Leetcode350 {

    public int[] intersect(int[] nums1, int[] nums2) {
        Map<Integer, Integer> map1 = new HashMap<>();
        for (int i : nums1) {
            map1.put(i, map1.getOrDefault(i, 0) + 1);
        }

        Map<Integer, Integer> map2 = new HashMap<>();
        for (int i : nums2) {
            map2.put(i, map2.getOrDefault(i, 0) + 1);
        }

        List<Integer> res = new ArrayList<>();
        for (Map.Entry<Integer, Integer> num : map1.entrySet()) {
            if (map2.containsKey(num.getKey())) {
                int number = Math.min(num.getValue(), map2.get(num.getKey()));
                while (number > 0) {
                    res.add(num.getKey());
                    number--;
                }
            }
        }


        return res.stream().mapToInt(Integer::valueOf).toArray();
    }
}
